﻿using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;

namespace WPF_for_Auth.ViewModel
{
    internal partial class DbOperate : ObservableObject
    {

        private readonly MvvmLoad _mvvmLoad;


        public DbOperate(MvvmLoad mvvmLoad)
        { 
            _mvvmLoad = mvvmLoad;
        }

        public void OperationAction(string parameter)
        {
            switch (parameter)
            {
                case "PageManager_Detail_Save":
                    {
                        SavePage();
                        DoPageWithControlSave();
                        // 重新加载页面列表

                        _mvvmLoad.App_PageStatus.ChoosePage("PageManager");
                    }
                    break;
                default:
                    MessageBox.Show($"执行操作：{parameter}", "操作提示", MessageBoxButton.OK, MessageBoxImage.Information);
                    break;
            }
        }

        #region 关于Page进行管理与操作

        [ObservableProperty]
        private List<DB.Models.Page>? getPages;
        [ObservableProperty]
        private DB.Models.Page? currentEditPage;

        public void PageManagerLoad()
        {
            using (DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                // 获取所有页面信息
                GetPages = db.Pages
                    .Include(p => p.PageWithControls)
                    .Include(p => p.PageWithMenus)
                    .OrderBy(o => o.CreateTime)
                    .ToList();
                // 如果需要，可以在这里进行其他处理或初始化


            }
        }

        public void SearchPages(string parameter)
        {
            using(DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                // 根据参数搜索页面
                GetPages = db.Pages
                    .Where(p => p.Name.Contains(parameter) || p.Description.Contains(parameter))
                    .Include(p => p.PageWithControls)
                    .Include(p => p.PageWithMenus)
                    .ToList();
            }
        }

        
        public void MakeNewPage()
        {
            CurrentEditPage = new DB.Models.Page
            {
                Name = "新建页面",
                Description = "这是一个新建的页面",
                CreateTime = DateTime.Now,
                UpdateTime = DateTime.Now
            };
        }

        public void EditPage(string parameter)
        {
            using(DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                // 根据参数获取页面
                CurrentEditPage = db.Pages
                    .Include(p => p.PageWithControls)
                    .Include(p => p.PageWithMenus)
                    .FirstOrDefault(p => p.Id == parameter);

                if (CurrentEditPage == null)
                {
                    throw new Exception("页面不存在");
                }
            }
        }
        /// <summary>
        /// 保存当前编辑的页面信息。
        /// </summary>
        /// <exception cref="Exception"></exception>
        public void SavePage()
        {
            if (CurrentEditPage == null)
            {
                throw new Exception("没有要保存的页面");
            }
            using (DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                var tempPage = db.Pages
                    .Include(p => p.PageWithControls)
                    .Include(p => p.PageWithMenus).Where(o => o.Id == CurrentEditPage.Id).SingleOrDefault();
                if (tempPage != null)
                {
                    // 更新现有页面
                    tempPage.Name = CurrentEditPage.Name;
                    tempPage.Description = CurrentEditPage.Description;
                    tempPage.Path = CurrentEditPage.Path;
                    tempPage.UpdateTime = DateTime.Now;                    
                    
                    db.Pages.Update(tempPage);
                }
                else
                {
                    // 添加新页面
                    CurrentEditPage.Id = Guid.NewGuid().ToString(); // 确保新页面有唯一的ID
                    db.Pages.Add(CurrentEditPage);
                }
                try
                {
                    db.SaveChanges();
                }
                catch (Exception ex)
                {

                    //throw;
                }
            }
            

        }

        private void DoPageWithControlSave()
        {
            using (DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                if (currentEditPage.PageWithControls != null)
                {
                    var list = currentEditPage.PageWithControls.ToList();

                    #region 先保证 本次有的一定要新增或更新到数据库中
                    for (int i = 0; i < list.Count; i++)
                    {
                        var item = list[i];

                        var compareItem_Temp = db.PageWithControls.Where(o => o.Id == item.Id).SingleOrDefault();

                        if (compareItem_Temp == null)
                        {
                            //现在的数据有，但是数据库中没有。
                            //直接增加，没毛病。2025年7月2日14:14:43
                            item.Id = Guid.NewGuid().ToString(); // 确保新控件有唯一的ID
                            db.PageWithControls.Add(item);
                        }
                        else
                        {
                            //现在的数据有，数据库中也有，需要对比一下。
                            if (compareItem_Temp.Name == item.Name && compareItem_Temp.Description == item.Description)
                            {
                                //这叫完全相同，不要动。
                            }
                            else
                            {
                                //不同，那就改改吧。
                                compareItem_Temp.Name = item.Name;
                                compareItem_Temp.Description = item.Description;
                                compareItem_Temp.UpdateTime = DateTime.Now;
                                db.PageWithControls.Update(compareItem_Temp);
                            }
                        }
                    }
                    #endregion


                    #region 再处理，数据库里面有，但本次不存在的内容，久需要删除掉了。
                    var list_in_db = db.PageWithControls.Where(o => o.PageId == CurrentEditPage.Id).ToList();

                    for (int i = 0; i < list_in_db.Count; i++)
                    {
                        var id_in_db = list_in_db[i].Id;

                        bool canFind = false;
                        for (int compareWithListIndex = 0; compareWithListIndex < list.Count; compareWithListIndex++)
                        {
                            if (id_in_db == list[compareWithListIndex].Id)
                            {
                                canFind = true;
                                break;
                            }
                        }

                        if (canFind)
                        {
                            //数据库中有，现在也有。可以不处理。2025年7月2日14:28:36
                        }
                        else
                        {
                            //相反，数据库中有，但是现在的数据中没有这条，那么咱们把它删掉吧。2025年7月2日14:29:12
                            db.PageWithControls.Remove(list_in_db[i]);
                        }
                    }
                    #endregion
                }


                db.SaveChanges();
            }
                

        }
        #endregion


        #region 关于Rols进行管理与操作

        [ObservableProperty]
        private List<DB.Models.Role>? getRoles;
        [ObservableProperty]
        private DB.Models.Role? currentEditRole;

        public void RoleManagerLoad()
        {
            using (DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                // 获取所有角色信息
                GetRoles = db.Roles
                    .Include(r => r.RoleComparePageControls)
                    .OrderBy(o => o.CreateTime)
                    .ToList();
            }
        }



        #endregion



        #region 关于权限的判断


        /// <summary>
        /// 当前用户权限，是否能看到指定的页面。
        /// </summary>
        /// <param name="pageId"></param>
        /// <param name="roleId"></param>
        /// <param name="comparePageWithControlName">我想使用这个做对比</param>
        /// <returns></returns>
        private bool CheckPermission(string pageId, string roleId,string comparePageWithControlName)
        {
            using (DB.Models.QiAuthBaseContext db = new DB.Models.QiAuthBaseContext())
            {
                // 检查角色是否有权限访问指定页面的相关控制器
                var list = db.RoleComparePageControls
                    .Include(r => r.Role)
                    .Include(r => r.PageWithControl)
                    .ThenInclude(pwc => pwc.Page)
                    .Where(rpc => rpc.RoleId == roleId && rpc.PageWithControl.PageId == pageId )
                    .ToList();

                //没做完 ,2025年7月3日16:54:57 但是逻辑应该能行得通。唯一问题是，具体的权限害的判断。没做成固定的，现在可以用户自定义。
                //2025年7月4日11:06:52 继续
                if (list.Count == 0)
                {
                    // 没有权限
                    return false;
                }

                // 在这里，再分析一下，是否有特定的权限。
                // 例如，检查是否有特定的操作权限
                for (int i = 0; i < list.Count; i++)
                {
                    var temp = list[i];

                    #region MyRegion
                    //switch (temp.PageWithControl.Name)
                    //{
                    //    case "查看全部":
                    //        // 允许查看全部
                    //        break;
                    //    case "查看自己及下属":
                    //        break;
                    //    case "查看本部门":
                    //        break;
                    //    case "仅看自己":
                    //        break;
                    //    case "创建数据":
                    //        break;
                    //    case "编辑数据":
                    //        break;
                    //    case "删除数据":
                    //        break;
                    //    default:
                    //        break;
                    //}
                    #endregion


                    // 这里可以根据具体的权限名称进行判断
                    if (temp.PageWithControl.Name == comparePageWithControlName)
                    {
                        return true;
                        break;
                    }
                    //这里，我暂时想到这个办法，因为页面中的控件名称是可以自定义的，所以我就用这个来判断了。
                }


                return false; // 返回是否有权限
            }
        }

        private void CheckPermission(string pageId, string roleId)
        {
            // 这里可以调用 CheckPermission 方法来检查权限
            bool allow_Find_All = CheckPermission(pageId, roleId, "查看全部");
            bool allow_Find_Self_And_Subordinate = CheckPermission(pageId, roleId, "查看自己及下属");
            bool allow_Find_SelfDepartment = CheckPermission(pageId, roleId, "查看本部门");
            bool allow_Find_SelfOnly = CheckPermission(pageId, roleId, "仅查看自己");
            bool allow_Operate = CheckPermission(pageId, roleId, "创建数据");
            bool allow_Update = CheckPermission(pageId, roleId, "修改数据");
            bool allow_Delete = CheckPermission(pageId, roleId, "删除数据");

        }


        #endregion

    }

    internal class TestDataConvertHelper : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


    internal class TimeConvertHelper : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is DateTime)
            {
                return ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss.ffff");
            }
            else
            {
                return value;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
